package org.sql.jdbc.datasource;

import java.util.Map;

import javax.sql.DataSource;

import org.sql.utils.AppUtil;

import com.alibaba.druid.pool.DruidDataSource;

/**
 * 数据源工具。 可以动态添加删除数据源。
 * 
 * <pre>
 * 构建组：ibps-base-datasource
 * 作者：hugh zhuang
 * 邮箱：3378340995@qq.com
 * 日期：2015-10-10-上午10:53:42
 * 版权：广州流辰信息技术有限公司版权所有
 * </pre>
 */
public class DataSourceUtil {

	/** 全局数据源 */
	public static final String GLOBAL_DATASOURCE = "dataSource";
	/** 默认数据源 */
	public static final String DEFAULT_DATASOURCE = "dataSource_default";
	/** 目标数据源 */
	public static final String TARGET_DATASOURCES = "targetDataSources";

	/**
	 * 添加数据源 。
	 * 
	 * @param key
	 * @param dataSource
	 *            void
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public static void addDataSource(String key, DataSource dataSource,
			boolean replace) throws IllegalAccessException,
			NoSuchFieldException {
		DynamicDataSource dynamicDataSource = (DynamicDataSource) AppUtil.getBean(GLOBAL_DATASOURCE);
		if (dynamicDataSource.isExist(key) && !replace)
			return;
		if (dynamicDataSource.isExist(key) && replace)
			dynamicDataSource.remove(key);
		dynamicDataSource.add(key, dataSource);
	}

	/**
	 * 添加数据源。
	 * 
	 * @param alias
	 *            数据源名称
	 * @param driverClassName
	 *            数据源驱动名称
	 * @param url
	 *            数据源URL
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 *             void
	 */
	public static void addDataSource(String alias, String driverClassName,
			String url, String username, String password)
			throws IllegalAccessException, NoSuchFieldException {
		DruidDataSource ds = createDataSource(driverClassName, url, username, password);
		addDataSource(alias, ds, true);
	}

	/**
	 * 根据名字删除数据源。
	 * 
	 * @param key
	 *            void
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public static void removeDataSource(String key)
			throws IllegalAccessException, NoSuchFieldException {
		DynamicDataSource dynamicDataSource = (DynamicDataSource) AppUtil.getBean(GLOBAL_DATASOURCE);
		dynamicDataSource.remove(key);
	}

	/**
	 * 取得数据源。
	 * 
	 * @return Map&lt;String,DataSource>
	 * @throws NoSuchFieldException
	 * @throws IllegalAccessException
	 */
	public static Map<Object, Object> getDataSources() {
		DynamicDataSource dynamicDataSource = (DynamicDataSource) AppUtil.getBean(GLOBAL_DATASOURCE);
		return dynamicDataSource.get();
	}

	/**
	 * 创建数据源。
	 * 
	 * @param driverClassName
	 * @param url
	 * @param username
	 * @param password
	 * @return BasicDataSource
	 */
	public static DruidDataSource createDataSource(String driverClassName,
			String url, String username, String password) {
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName(driverClassName);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		dataSource.setTestWhileIdle(true);
		return dataSource;
	}

	/**
	 * 根据别名返回容器里对应的数据源
	 * 
	 * @param alias
	 * @return
	 * @throws IllegalAccessException
	 * @throws NoSuchFieldException
	 *             DataSource
	 * @exception
	 * @since 1.0.0
	 */
	public static DataSource getDataSourceByAlias(String alias) {
		Map<Object, Object> map = getDataSources();
		return (DataSource) map.get(alias);
	}

}
